#include "ClientReport.h"
#include "ui_ReportConfig.h"

extern QSqlDatabase enjoylifedb;

ReportClientGenerator::ReportClientGenerator(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ReportConfig)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    setWindowTitle("Configuración listado de clientes");

    // Se setea el nombre del reporte por defecto
    QDate date = QDate::currentDate();
    QTime time = QTime::currentTime();
    QString str;
    str.append("Reporte-clientes-");
    str.append(QString::number(date.day())).append("-").append(QString::number(date.month()));
    str.append("-").append(QString::number(date.year())).append("-");
    str.append(QString::number(time.hour())).append("-");
    str.append(QString::number(time.minute()));
    ui->report_name->setText(str);

    ui->val_puntual_date->setDate(QDate::currentDate());
    ui->val_puntual_date->setEnabled(false);

    ui->val_from_date->setDate(QDate::currentDate());
    ui->val_from_date->setEnabled(false);

    ui->val_to_date->setDate(QDate::currentDate());
    ui->val_to_date->setEnabled(false);

    ui->val_razon_social->setEnabled(false);
    ui->val_responsable->setEnabled(false);
    ui->group_fecha->setEnabled(false);

    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(close()));
    connect(ui->opt_razon_soc,SIGNAL(clicked()),this,SLOT(on_opt_razon_soc()));
    connect(ui->opt_fecha,SIGNAL(clicked()),this,SLOT(on_opt_fecha()));
    connect(ui->opt_puntual_date,SIGNAL(clicked()),this,SLOT(on_opt_puntual_date()));
    connect(ui->opt_from_to_date,SIGNAL(clicked()),this,SLOT(on_opt_from_to_date()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

ReportClientGenerator::~ReportClientGenerator()
{
    delete ui;
}

void ReportClientGenerator::on_guardarBtn_clicked()
{
    if (ui->report_name->text().isEmpty()) {
        QMessageBox::critical(0,"Error","Se debe ingresar el nombre del reporte");
        return;
    }

    if (report_path.isNull()) {
        QMessageBox::critical(0,"Error","Se debe elegir el directorio del reporte");
        return;
    }

    QPrinter* print = new QPrinter(QPrinter::HighResolution);
    print->setOutputFormat(QPrinter::PdfFormat);
    QTextDocument *document = new QTextDocument;

    QTextCursor cursor(document);

    cursor.movePosition(QTextCursor::Start);

    QTextImageFormat picture1;
    picture1.setName("://Images/membrete recibo-15.png");
    picture1.setWidth(630);
    picture1.setHeight(120);
    cursor.insertImage(picture1,QTextFrameFormat::InFlow);

    cursor.insertBlock();
    cursor.insertBlock();
    QTextCharFormat header_format;
    QFont headerfont;
    headerfont.setFamily("Helvetica57");
    headerfont.setBold(true);
    header_format.setFont(headerfont);

    cursor.insertText("Listado de Clientes",header_format);
    cursor.insertBlock();
    cursor.insertBlock();

    QTextTableFormat table_format;
//    table_format.setAlignment(Qt::AlignCenter);
    table_format.setHeaderRowCount(1);
    table_format.setBorderStyle(QTextFrameFormat::BorderStyle_Groove);
    table_format.setCellSpacing(0);
    table_format.setCellPadding(3);
//    table_format.setWidth(QTextLength(QTextLength::PercentageLength, 100));

    int column_count = 0;

    QString str_query = "select ";

    if (ui->checkBox_nro_cliente->isChecked()) {
        str_query.append("nro_cliente");
        column_count = column_count + 1;
    }

    if (ui->checkBox_razon_soc->isChecked()) {
        str_query.append(",razon_social");
        column_count = column_count + 1;
    }

    if (ui->checkBox_respons->isChecked()) {
        str_query.append(",responsable");
        column_count = column_count + 1;
    }

    if (ui->checkBox_fecha_alta->isChecked()) {
        str_query.append(",fecha_alta");
        column_count = column_count + 1;
    }

    if (ui->checkBox_calle->isChecked()) {
        str_query.append(",calle");
        column_count = column_count + 1;
    }

    if (ui->checkBox_num->isChecked()) {
        str_query.append(",numero");
        column_count = column_count + 1;
    }

    if (ui->checkBox_piso->isChecked()) {
        str_query.append(",piso");
        column_count = column_count + 1;
    }

    if (ui->checkBox_dpto->isChecked()) {
        str_query.append(",dpto");
        column_count = column_count + 1;
    }

    if (ui->checkBox_barrio->isChecked()) {
        str_query.append(",barrio");
        column_count = column_count + 1;
    }

    if (ui->checkBox_ciudad->isChecked()) {
        str_query.append(",ciudad");
        column_count = column_count + 1;
    }

    if (ui->checkBox_provincia->isChecked()) {
        str_query.append(",provincia");
        column_count = column_count + 1;
    }

    if (ui->checkBox_tel1->isChecked()) {
        str_query.append(",telefono_1");
        column_count = column_count + 1;
    }

    if (ui->checkBox_tel2->isChecked()) {
        str_query.append(",telefono_2");
        column_count = column_count + 1;
    }

    if (ui->checkBox_email->isChecked()) {
        str_query.append(",email_1");
        column_count = column_count + 1;
    }

    str_query.append(" from cliente");

    QString filter;

    /**
       Se quiere filtrar por la razón social del cliente
    */
    if (ui->opt_razon_soc->isChecked()) {

        if (!ui->val_razon_social->text().isEmpty())
            filter = "razon_social like '%" + ui->val_razon_social->text() + "%'";
    }

    /**
        Se quiere filtrar por la fecha
    */
    else if (ui->opt_fecha->isChecked()) {

        // Fecha puntual, se indica una fecha a la que se quiere filtrar
        if (ui->opt_puntual_date->isChecked()) {
            QString format = "yyyy-MM-dd";
            QString fecha = ui->val_puntual_date->date().toString(format);
            filter = "fecha_alta = '" + fecha + "'";
        }

        // Se ingresa una fecha desde hasta
        else if (ui->opt_from_to_date->isChecked()) {

            if (ui->val_from_date->date() >= ui->val_to_date->date()) {
                QMessageBox::critical(this, "Advertencia!", "La fecha inicial no puede ser mayor que la final");
                return;
            }
            else {
                QString format = "yyyy-MM-dd";
                QString fecha_from = ui->val_from_date->date().toString(format);
                QString fecha_to = ui->val_to_date->date().toString(format);
                filter = "fecha_alta >= '" + fecha_from + "' and fecha_alta <= '" + fecha_to + "'";
            }
        }
    }

    /**
        Se quiere filtrar por el nombre de los responsables
    */
    else if (ui->opt_responsable->isChecked()) {

        if (!ui->val_responsable->text().isEmpty()) {
            filter = "responsable like '%" + ui->val_razon_social->text() + "%' and ";
            filter.append("estado is null");
        }
    }

    if (! filter.isEmpty())
        str_query.append(" where ").append(filter).append("  order by razon_social");

    QSqlQuery* query = new QSqlQuery(enjoylifedb);

    if (! query->exec(str_query)) {
        QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
        return;
    }

    if (query->size() > 0)
        cursor.insertTable(query->size() + 1,column_count,table_format);

    else {
        QMessageBox::critical(this,"Advertencia!", "No existen registros con ese filtro. Intente nuevamente");
        return;
    }

    // Se ponen los distintos encabezados

    QFont cell_h_font;
    cell_h_font.setBold(true);
    cell_h_font.setFamily("Helvetica57");
    QTextCharFormat cell_header_font;
    cell_header_font.setFont(cell_h_font);

    if (ui->checkBox_nro_cliente->isChecked())
        cursor.insertText("Nro Cliente",cell_header_font);

    if (ui->checkBox_razon_soc->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Razon Social",cell_header_font);
    }

    if (ui->checkBox_respons->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Responsable",cell_header_font);
    }

    if (ui->checkBox_fecha_alta->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Fecha Alta",cell_header_font);
    }

    if (ui->checkBox_calle->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Calle",cell_header_font);
    }

    if (ui->checkBox_num->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Número",cell_header_font);
    }

    if (ui->checkBox_piso->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Piso",cell_header_font);
    }

    if (ui->checkBox_dpto->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Dpto",cell_header_font);
    }

    if (ui->checkBox_barrio->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Barrio",cell_header_font);
    }

    if (ui->checkBox_ciudad->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Ciudad",cell_header_font);
    }

    if (ui->checkBox_provincia->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Pcia",cell_header_font);
    }

    if (ui->checkBox_tel1->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Tel 1",cell_header_font);
    }

    if (ui->checkBox_tel2->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Tel 2",cell_header_font);
    }

    if (ui->checkBox_email->isChecked()) {
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("E-mail",cell_header_font);
    }

    QTextCharFormat char_format;
    QFont cell_font;
    cell_font.setFamily("Helvetica57-Condensed");
    char_format.setFont(cell_font);

    cursor.movePosition(QTextCursor::NextCell);

    // Se recorre el query para obtener los valores
    while (query->next()) {

        for (int i = 0 ; i < column_count ; i++) {
            cursor.insertText(query->value(i).toString(),char_format);
            cursor.movePosition(QTextCursor::NextCell);
        }
    }

    cursor.movePosition(QTextCursor::End);

    QString path;
    path.append(report_path).append("/").append(ui->report_name->text()).append(".pdf");
    print->setOutputFileName(path);
    document->print(print);

    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(this, "Creación Exitosa", "El reporte se ha creado exitosamente. Quiere abrir el reporte ahora?",
                                    QMessageBox::Yes|QMessageBox::No);

    if (reply == QMessageBox::Yes) {
        if (! QDesktopServices::openUrl(QUrl(path))) {
            QMessageBox::information(this,"Información", "No se puede abrir el reporte");
        }
    }
    close();
}

void ReportClientGenerator::on_opt_todos_clientes_clicked()
{
    ui->val_razon_social->setEnabled(false);
    ui->group_fecha->setEnabled(false);
    ui->val_responsable->setEnabled(false);
}

void ReportClientGenerator::on_opt_razon_soc()
{
    ui->val_razon_social->setEnabled(ui->opt_razon_soc->isChecked());
    ui->group_fecha->setEnabled(false);
    ui->val_responsable->setEnabled(false);
}

void ReportClientGenerator::on_opt_fecha()
{
    ui->group_fecha->setEnabled(ui->opt_fecha->isChecked());
    ui->val_razon_social->setEnabled(false);
    ui->val_responsable->setEnabled(false);
}

void ReportClientGenerator::on_opt_puntual_date()
{
    ui->val_puntual_date->setEnabled(ui->opt_puntual_date->isChecked());
    ui->opt_from_to_date->setChecked(false);
    ui->val_from_date->setEnabled(false);
    ui->val_to_date->setEnabled(false);
}

void ReportClientGenerator::on_opt_from_to_date()
{
    ui->val_from_date->setEnabled(ui->opt_from_to_date->isChecked());
    ui->val_to_date->setEnabled(ui->opt_from_to_date->isChecked());
    ui->val_puntual_date->setEnabled(false);
}

void ReportClientGenerator::on_opt_responsable_clicked()
{
    ui->val_responsable->setEnabled(ui->opt_responsable->isChecked());
    ui->val_razon_social->setEnabled(false);
    ui->group_fecha->setEnabled(false);
}

void ReportClientGenerator::on_checkBox_razon_soc_clicked()
{
    ui->opt_razon_soc->setEnabled(ui->checkBox_razon_soc->isChecked());
}

void ReportClientGenerator::on_checkBox_fecha_alta_clicked()
{
    ui->opt_fecha->setEnabled(ui->checkBox_fecha_alta->isChecked());
}

void ReportClientGenerator::on_checkBox_respons_clicked()
{
    ui->opt_responsable->setEnabled(ui->checkBox_respons->isChecked());
}

void ReportClientGenerator::on_select_dir_btn_2_clicked()
{
    report_path = QFileDialog::getExistingDirectory(this, "Seleccione directorio de salida",QDir::current().homePath(),QFileDialog::ShowDirsOnly|QFileDialog::ReadOnly);

    if (!report_path.isEmpty())
        ui->path_label->setText(report_path);
}
